home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
a_utils
/
yacc
/
occam.lha
/
occam
/
occam2.y
< prev
next >
Wrap
Text File
|
1989-08-22
|
7KB
|
434 lines
/*
*
* OCCAM2 yacc specification
*
* Peter Polkinghorne - GEC Research
*
*/
/*
* This work is in the public domain.
* It was written by Peter Polkinghorne in 1986 & 1989 at
* GEC Hirst Research Centre, Wembley, England.
* No liability is accepted or warranty given by the Author,
* still less my employers.
*/
/* revision history
0.0 initial attempt pjmp 9/3/89
end revisions */
%token VAR CHAN ANY SKIP ID EOL
%token VALUE BYTE DEF PROC NOT NUMBER BOOL
%token NOW TABLE BOOLOP SHIFTOP COMPOP CHCON STR
%token LOGOP SEQ ALT IF PAR WHILE FOR
%token OF SIZE TRUNC ROUND MOSTNEG MOSTPOS RNUMBER
%token STOP CASE ELSE IS VAL FROM PROTOCOL
%token INT INT16 INT32 INT64 REAL REAL32 REAL64
%token PLACE AT PLACED PROCESSOR FUNCTION
%token AFTER RETYPES VALOF RESULT PORT PRI
%token BEG END TO TIMER
%start program
%%
program : sep process
| process
;
process : action sep
| SKIP sep
| STOP sep
| CASE selector sep
| CASE selector sep BEG selectlist END
| construct
| instance
| specification sep process
| caseinput
| allocation sep process
| error sep
{
yyerrok;
}
;
action : assignment
| input
| output
;
allocation : PLACE ID AT expr ':'
;
selectlist : select
| selectlist select
;
select : expr sep BEG process END
| ELSE sep BEG process END
;
selector : expr
;
construct : sequence
| parallel
| conditional
| alternation
| loop
;
instance : ID '(' actualist ')' sep
| ID '(' ')' sep
;
actualist : actual
| actualist comma actual
;
actual : element
| expr
;
sequence : SEQ sep BEG proclist END
| SEQ replic sep BEG process END
| SEQ sep
;
parallel : PAR sep BEG proclist END
| PAR replic sep BEG process END
| PAR sep
| PRI PAR sep BEG proclist END
| PRI PAR replic sep BEG process END
| PRI PAR sep
| PLACED PAR sep BEG placelist END
| PLACED PAR replic sep BEG placement END
| PLACED PAR sep
;
conditional : IF sep BEG choicelist END
| IF replic sep BEG choice END
| IF sep
;
alternation : ALT sep BEG alternativelist END
| ALT replic sep BEG alternative END
| ALT sep
| PRI ALT sep BEG alternativelist END
| PRI ALT replic sep BEG alternative END
| PRI ALT sep
;
loop : WHILE expr sep BEG process END
;
sep : EOL
| sep EOL
;
comma : ',' EOL
| ','
;
semicolon : ';' EOL
| ';'
;
proclist : process
| proclist process
;
choicelist : choice
| choicelist choice
;
placelist : placement
| placelist placement
;
alternativelist : alternative
| alternativelist alternative
;
replic : ID '=' base FOR count
;
base : expr
;
count : expr
;
choice : boolean sep BEG process END
| specification sep choice
| conditional
;
placement : PROCESSOR expr sep BEG process END
;
alternative : guard sep BEG process END
| specification sep alternative
| alternation
;
guard : boolean '&' input
| input
| boolean '&' SKIP
;
specification : declaration
| abbreviation
| definition
;
declaration : type namelist ':'
;
namelist : ID
| namelist comma ID
;
abbreviation : specifier ID IS element ':'
| VAL specifier ID IS element ':'
| ID IS element ':'
| VAL ID IS element ':'
;
specifier : primtype
| '['']' specifier
| '[' expr ']' specifier
;
definition : PROTOCOL ID IS simpleproto ':'
| PROTOCOL ID IS seqproto ':'
| PROTOCOL ID sep BEG CASE sep END ':'
| PROTOCOL ID sep BEG CASE sep BEG tagprotolist END END ':'
| PROC ID '(' fparmlist ')' sep BEG process END ':'
| PROC ID '(' ')' sep BEG process END ':'
| typelist FUNCTION ID '(' fparmlist ')' sep BEG valof END ':'
| typelist FUNCTION ID '(' ')' sep BEG valof END ':'
| typelist FUNCTION ID '(' fparmlist ')' IS explist ':'
| typelist FUNCTION ID '(' ')' IS explist ':'
| specifier ID RETYPES element ':'
| VAL specifier ID RETYPES expr ':'
;
simpleproto : type
| type ':' ':' '[' ']' type
;
seqproto : simpleproto
| seqproto semicolon simpleproto
;
tagprotolist : tagproto
| tagprotolist sep tagproto
;
tagproto : tag
| tag semicolon protocol
;
tag : ID
;
protocol : ANY
| ID
| simpleproto
;
assignment : varlist ':' '=' explist
;
input : chan '?' inlist
| chan '?' CASE taggedlist
| port '?' var
| timer '?' var
| timer '?' AFTER expr
;
caseinput : chan '?' CASE sep
| chan '?' CASE sep BEG variantlist END
;
taggedlist : tag
| tag semicolon inlist
;
variantlist : variant
| variantlist sep variant
;
variant : taggedlist sep BEG process END
| specification sep variant
;
output : chan '!' outlist
| chan '!' tag
| chan '!' tag semicolon outlist
| port '!' element
| port '!' expr
;
inlist : var
| var ':' ':' var
| inlist semicolon var
;
outlist : expr
| expr ':' ':' expr
| outlist semicolon expr
;
explist : expr
| explist comma expr
| '(' valof sep ')'
| ID '(' explist ')'
| ID '(' ')'
;
varlist : var
| varlist comma var
;
typelist : type
| typelist comma type
;
fparmlist : fparm
| fparmlist comma fparm
;
fparm : specifier ID
| VAL specifier ID
;
var : element
;
timer : element
;
chan : element
;
port : element
;
element : ID
| element '[' subscript ']'
| '[' element FROM subscript TO subscript ']'
;
subscript : expr
;
expr : monop operand
| operand dyop operand
| monop sep operand
| operand dyop sep operand
| operand
| conversion
| MOSTPOS type
| MOSTNEG type
;
operand : element
| literal
| '(' expr ')'
| '[' explist ']'
| '(' valof sep ')'
| ID '(' explist ')'
| ID '(' ')'
;
conversion : type operand
| type ROUND operand
| type TRUNC operand
;
monop : '-'
| NOT
| SIZE
| '~'
;
literal : NUMBER
| BOOL
| RNUMBER
| CHCON
| STR
| NUMBER '(' type ')'
| RNUMBER '(' type ')'
| CHCON '(' type ')'
;
dyop : COMPOP
| '='
| SHIFTOP
| '+'
| '*'
| LOGOP
| BOOLOP
| '-'
| '/'
| '\\'
;
valof : VALOF sep BEG process RESULT explist sep END
| specification sep valof
;
type : primtype
| arrtype
;
primtype : CHAN OF protocol
| PORT OF type
| TIMER
| BOOL
| BYTE
| INT
| INT16
| INT32
| INT64
| REAL32
| REAL64
;
arrtype : '[' expr ']' type
;
boolean : expr
;
%%
#include <stdio.h>
void main()
{
exit( yyparse() );
}/*main*/
yyerror( str )
char *str;
/* our slightly more informative error routine */
{
extern int yylineno;
extern char yytext[];
fprintf( stderr, "ERROR <%s> near <%s> on line %d\n",
str, yytext, yylineno );
}/*yyerror*/
/*end occam.y*/